
//! 插件清单 (Manifest) - 完整实现
//! 
//! 每个插件通过清单文件声明其元数据、依赖关系、贡献点等信息。
//! 这个版本完全对齐 `ai-server` 的 `manifests/types.py` 文件。

use std::collections::HashMap;
use crate::core::plugin::RigPlugin;

// --- 辅助类型，对应 Python 版本中的各种 Definition 类 ---

/// 激活事件结构体，支持 `when` 条件判断
#[derive(Clone, Debug)]
pub struct ActivationEventStruct {
    pub name: String,
    pub when: Option<String>,
}

/// 激活事件，可以是简单的字符串，也可以是带条件的结构体
#[derive(Clone, Debug)]
pub enum ActivationEvent {
    Simple(String),
    Conditional(ActivationEventStruct),
}

impl ActivationEvent {
    pub fn get_name(&self) -> &str {
        match self {
            ActivationEvent::Simple(name) => name,
            ActivationEvent::Conditional(s) => &s.name,
        }
    }
}

/// 贡献点定义
#[derive(Clone, Debug)]
pub struct ContributionPointDefinition {
    pub name: String,
    pub description: Option<String>,
    pub support_dynamics: Option<bool>,
    pub is_replenish: Option<bool>,
    pub replenish_by: Option<String>,
}

/// 贡献定义
#[derive(Clone, Debug)]
pub struct ContributeDefinition {
    pub name: String,
    pub cp: Option<String>, // cp: Contribution Point
    pub description: Option<String>,
    pub is_replenish: Option<bool>,
    pub replenish_by: Option<String>,
}

/// 贡献关键字定义
#[derive(Clone, Debug)]
pub struct ContributionKeywordDefinition {
    pub name: String,
    pub support_contribution_point: Option<bool>,
    pub support_dynamics: Option<bool>,
    pub provide_context: Option<bool>,
    pub context_name: Option<String>,
    pub disable_namespace_rule: Option<bool>,
}

/// 激活事件的完整定义，包含前后依赖关系
#[derive(Clone, Debug)]
pub struct ActivationEventDefinition {
    pub name: String,
    pub pre_activation_events: Option<Vec<String>>,
}


// --- 核心清单结构体 ---

/// 插件清单，描述一个插件的所有元信息。
/// 这是 `ai-server` 中 `ExpansionManifest` 的完整 Rust 实现。
#[derive(Clone)]
pub struct ExpansionManifest {
    // === 基本信息 ===
    pub name: String,
    pub description: String,
    pub publisher: String,
    pub version: String,
    pub readme: Option<String>,

    // === 依赖关系 ===
    pub dependencies: Option<HashMap<String, String>>,

    // === 加载方式 ===
    /// 本地实现，返回插件实例的工厂函数
    pub implementation: fn() -> Box<dyn RigPlugin>,
    // pub remote_impl: ..., // 远程异步加载，暂不实现
    // pub remote_entry: Option<String>, // 远程模块地址，暂不实现

    // === 生命周期 ===
    pub activation_events: Vec<ActivationEvent>,
    pub deactivation_events: Option<Vec<ActivationEvent>>,

    // === 贡献系统 ===
    pub contributes: Option<HashMap<String, Vec<ContributeDefinition>>>,
    pub dynamic_contributes: Option<HashMap<String, Vec<ContributeDefinition>>>,
    pub contribution_points: Option<HashMap<String, Vec<ContributionPointDefinition>>>,
    pub dynamic_contribution_points: Option<HashMap<String, Vec<ContributionPointDefinition>>>,
    pub contribution_keywords: Option<Vec<ContributionKeywordDefinition>>,

    // === 上下文 ===
    pub provide_context: Option<bool>,
    pub context_name: Option<String>,
}
